home *** CD-ROM | disk | FTP | other *** search
/ Everything For A Hacker / 19990506-[HACK].iso / SECURE / CRYPT / GOST.ZIP / SHOWGOST.C < prev    next >
C/C++ Source or Header  |  1995-02-18  |  5KB  |  175 lines

  1. /*----------------------------------------------------
  2.   ShowGost.c - »α«úαá¼¼á ñ½∩ óδó«ñá «ΓτÑΓá « »α«µÑßßÑ
  3.            Φ¿Σα«óá¡¿∩ »« âÄæÆ 28147-89
  4.   ----------------------------------------------------
  5.   (c) Copyright 1995 Ç¡ñαÑ⌐ ₧α∞Ñó¿τ é¿¡«¬πα«ó, î«ß¬óá
  6.   éÑαß¿∩ 1.00, 09.02.95
  7.   ----------------------------------------------------
  8.   Åα«úαá¼¼á óδñáÑΓ «ΓτÑΓ « ß«ßΓ«∩¡¿∩σ αÑú¿ßΓα«ó ¼«ñÑ-
  9.   ½¿ Φ¿Σα«óáΓѽ∩ »« âÄæÆ 28147-89. éßÑ »áαá¼ÑΓαδ Φ¿Σ-
  10.   α«óáΓѽ∩ ºáñáεΓß∩ »α«¿ºó«½∞¡«, τΓ«íδ éδ ¼«ú½¿ «ß¡«-
  11.   óáΓѽ∞¡« »«Ñ..Γ∞ á½ú«α¿Γ¼. ¥Γá »α«úαá¼¼á íπñÑΓ  éá¼
  12.   «..¿Γѽ∞¡« »«½Ñº¡á »α¿ «Γ½áñ¬Ñ ¼«ñπ½Ñ⌐ âÄæÆá.
  13.   ----------------------------------------------------
  14.   æ µÑ½∞ε  ñ«ßΓ¿ªÑ¡¿∩  ¼á¬ß¿¼á½∞¡«⌐  »α«ßΓ«Γδ  ñá¡¡á∩
  15.   »α«úαἼᠠ߫ñÑαª¿Γ  ½¿Φ∞  ¼¿¡¿¼á½∞¡δÑ »α«óÑન  ¡á
  16.   ¬«ααÑ¬Γ¡«ßΓ∞ óσ«ñ¡δσ ñá¡¡δσ.
  17.   ----------------------------------------------------
  18. */
  19. #include <ctype.h>    // isspace
  20. #include <io.h>        // eof
  21. #include <stdio.h>    // FILE,scanf,printf,etc....
  22. #include <stdlib.h>    // strtoul,lrotl
  23. #include <string.h>    // strcpy,strlen
  24.  
  25. typedef struct
  26. {
  27.   unsigned long low,high;
  28. } CryptoBlock;
  29.  
  30. unsigned short    KeyLength,KeyRepeat;
  31. unsigned long    Key[64];
  32. unsigned short    Cht[8][16];
  33. char        KeyUse[64+1];
  34. CryptoBlock    data;
  35.  
  36. void main(int argc,char **argv)
  37. {
  38.   FILE     *file;
  39.   unsigned i,j,k,l;
  40.   char       *p;
  41.   unsigned long Old=0UL;
  42.  
  43. // óδñáτá ¬«»¿αá⌐Γá
  44.   printf(
  45.   "Åα«úαá¼¼á óδñáτ¿ »«ñα«í¡«ú« «ΓτÑΓá « »α«µÑßßÑ Φ¿Σα«óá¡¿∩ "
  46.                          "»« âÄæÆ 28147-89\n"
  47.   "(c) Copyright 1995 Ç¡ñαÑ⌐ ₧α∞Ñó¿τ é¿¡«¬πα«ó, ú.î«ß¬óá\n\n"
  48.      );
  49.   if (argc<6)
  50.   {
  51.     printf(
  52.     "ö«α¼áΓ ¬«¼á¡ñ¡«⌐ ßΓ᫬¿ ºá»π߬ᠻα«úαá¼¼δ ñ«½ªÑ¡ íδΓ∞ ß½ÑñπεΘ¿⌐ :\n"
  53.     "\"name ChangeTableFile KeyFile KeyUsingScheme N1 N2\",  úñÑ :\n"
  54.     "name            - ¿¼∩ Σá⌐½á ß »α«úαá¼¼«⌐;\n"
  55.     "ChangeTableFile - ¿¼∩ Σá⌐½á ß Γáí½¿µÑ⌐ ºá¼Ñ¡,"
  56.                      " ºáñá¡¡«⌐ ó ΓѬßΓ«ó«⌐ Σ«α¼Ñ\n"
  57.     "                  Æç ñ«½ª¡á ß«ñÑαªáΓ∞ α«ó¡« 128 τ¿ßѽ «Γ 0 ñ« 255,\n"
  58.     "                  ºá»¿ßá¡¡δσ ó 16-α¿τ¡«⌐ ß¿ßΓѼѠßτ¿ß½Ñ¡¿∩;\n"
  59.     "KeyFile         - ¿¼∩ Σá⌐½á ß ¬½ετ«¼, »αÑñßΓáó½Ñ¡¡δ¼"
  60.                      " ó ß¿¼ó«½∞¡«⌐ Σ«α¼Ñ;\n"
  61.     "                  ¬½ετ ñ«½ªÑ¡ ß«ñÑαªáΓ∞ «Γ 1 ñ« 64 φ½Ñ¼Ñ¡Γ«ó"
  62.                      " - ñ½¿¡¡δσ µÑ½δσ\n"
  63.     "                  íѺ º¡á¬á, ºá»¿ßá¡¡δσ ó 16-α¿τ¡«⌐ ß¿ßΓѼÑ;\n"
  64.     "KeyUsingScheme  - ßΓα«¬á ¿º ß¿¼ó«½«ó 0 ¿ 1, "
  65.                      "«ΓαáªáεΘá∩ »«α∩ñ«¬ ¿ß»«½∞º«óá¡¿∩\n"
  66.     "                  φ½Ñ¼Ñ¡Γ«ó ¬½ετá: 0-ó»ÑαÑñ, 1-¡áºáñ;\n"
  67.     "N1,N2           - ß««ΓóÑΓßΓóÑ¡¡« ¼½áñΦá∩ ¿ ßΓáαΦá∩ τáßΓ¿"
  68.                      " Φ¿ΣαπѼ«ú« í½«¬á;\n"
  69.     "                  ñá¡¡δσ\n"
  70.     "\n"
  71.     );
  72.     return;
  73.   }
  74.  
  75. // τΓÑ¡¿Ñ Γáí½¿µδ ºá¼Ñ¡
  76.   if(!(file=fopen(argv[1],"rt")))
  77.   {
  78.     printf("ìÑ ¼«úπ «Γ¬αδΓ∞ Σá⌐½ Γáí½¿µδ ºá¼Ñ¡ - \"%s\"\n");
  79.     return;
  80.   }
  81.   for (i=0; i<8*16; i++)
  82.   {
  83.     fscanf(file,"%hx",Cht[0]+i);
  84. /*  if(eof(fileno(file)) || !isspace(getc(file)))
  85.     {
  86.       printf("ìÑñ«»πßΓ¿¼δ⌐ ß¿¼ó«½ ó« óσ«ñ¡«¼ »«Γ«¬Ñ\n");
  87.       return;
  88.     }
  89. */
  90.   }
  91.   fclose(file);
  92.  
  93. // τΓÑ¡¿Ñ ¬½ετá
  94.   if(!(file=fopen(argv[2],"rt")))
  95.   {
  96.     printf("ìÑ ¼«úπ «Γ¬αδΓ∞ Σá⌐½ ¬½ετá - \"%s\"\n");
  97.     return;
  98.   }
  99.   for (KeyLength=0; KeyLength<64; KeyLength++)
  100.     if (!(fscanf(file,"%lx",Key+KeyLength)==1))
  101.       break;
  102.   fclose(file);
  103.  
  104. // τΓÑ¡¿Ñ ßσÑ¼δ ¿ß»«½∞º«óá¡¿∩ ¬½ετá
  105.   if ((KeyRepeat=strlen(argv[3])) > 64)
  106.   {
  107.     printf("æΓ᫬á ßσÑ¼δ ¿ß»«½∞º«óá¡¿∩ ¬½ετá ß½¿Φ¬«¼ ñ½¿¡¡á∩\n");
  108.     return;
  109.   }
  110.   strcpy(KeyUse,argv[3]);
  111.   for (p=KeyUse; *p; p++)
  112.   {
  113.     if (*p != '0'  &&  *p != '1')
  114.     {
  115.       printf("é ßσѼѠ¿ß»«½∞º«óá¡¿∩ ¬½ετá ñ«»πßΓ¿¼δ Γ«½∞¬« 0 ¿ 1\n");
  116.       return;
  117.     }
  118.   }
  119.  
  120. // ñѬ«ñ¿α«óá¡¿Ñ ñá¡¡δσ ñ½∩ Φ¿Σα«óá¡¿∩
  121.   data.low=strtoul(argv[4],&p,16);
  122.   if (*p)
  123.   {
  124.     printf("ìÑñ«»πßΓ¿¼δ⌐ ß¿¼ó«½ ó ºá»¿ß¿ 16-α¿τ¡«ú« τ¿ß½á N1 - \"%c\"\n",
  125.         *p);
  126.     return;
  127.   }
  128.   data.high=strtoul(argv[5],&p,16);
  129.   if (*p)
  130.   {
  131.     printf("ìÑñ«»πßΓ¿¼δ⌐ ß¿¼ó«½ ó ºá»¿ß¿ 16-α¿τ¡«ú« τ¿ß½á N2 - \"%c\"\n",
  132.         *p);
  133.     return;
  134.   }
  135.  
  136. // ÉÑ὿ºáµ¿∩ á½ú«α¿Γ¼á Φ¿Σα«óá¡¿∩
  137. // óδñáτá ºáú«½«ó¬á
  138.   printf(
  139.   "ÿ¿Σα«óá¡¿Ñ ñá¡¡δσ »« «í«íΘÑ¡¡«¼π á½ú«α¿Γ¼π âÄæÆ 28147-89\n"
  140.   "<i> <--N2--> <--N1--> <-K[i]-> <N1+Ki > <ºá¼Ñ¡á> "
  141.        "<óαáΘ11> <--N2\'-> <--N1\'->\n"
  142.   );
  143.  
  144. // «ßπΘÑßΓó½Ñ¡¿Ñ »α«µÑñπαδ ºáΦ¿Σα«óá¡¿∩
  145.   for (i=0,l=0; i<KeyRepeat; i++)
  146.   {
  147.     putchar('\n');
  148.     for (j=0; j<KeyLength; j++,l++)
  149.     {
  150.       Old=data.low;
  151.       k= (KeyUse[i]=='0') ? j : KeyLength-j-1;
  152.       printf ("%03u %08lx %08lx %08lx",
  153.       k,data.high,data.low,Key[k]);
  154.       data.low+=Key[k];
  155.       printf (" %08lx",data.low);
  156.       for (k=0; k<8; k++)
  157.       {
  158.     unsigned long L;
  159.     L=Cht[k][(unsigned)(data.low & 0x0000000FUL)];
  160.     data.low &= ~0x0000000FUL;
  161.     data.low |= L;
  162.     data.low = _lrotl(data.low,4);
  163.       }
  164.       printf (" %08lx",data.low);
  165.       data.low=_lrotl(data.low,11);
  166.       printf (" %08lx",data.low);
  167.       data.low ^= data.high;
  168.       data.high = Old;
  169.       printf (" %08lx %08lx\n",data.high,data.low);
  170.     }
  171.   }
  172.   printf("\n\n Result=%08lx%08lx",data.low,data.high);
  173.  
  174. }
  175.